//코드를 분석해서 달달 외우자. 각각의 클래스가 정확히 어떤 용도에 의해서 어떤 방식으로 작동하는지, 
//각각의 메소드의 역할과 변수의 역할, 졸라 상세하게 분석하자. 그리고 그 역할에 맞춰서 코드가 어떻게 구현되는지
//큰거에서부터 작은것으로 안으로 파악해 나아가보자.
package customer.service;

import java.util.ArrayList;
import java.util.Iterator;

import customer.domain.Customer;

//고객을 관리하는 업무 처리 클래스
public class CustomerManagerArrayList {
	private ArrayList<Customer> list;
	public CustomerManagerArrayList(){
		//초기 100명의 고객을 저장할 수 있는 ArrayList객체 생성 및 대입
		list = new ArrayList<Customer>(100);
	}
	public CustomerManagerArrayList(int length){
		//매개 변수로 받은 length 만큼의 초기 고객을 저장할 수 있는 ArrayList객체 생성 및 대입
		list = new ArrayList<Customer>(length);
	}

	//매개변수로 받은 고객정보(커스터머 객체)를 리스트에 추가하는 메소드
	//1. 매개변수로 null이 들어온 경우
	//2. 매개변수로 받은 고객의 주민번호가 이미 등록된 고객의 것과 같은 경우
	//등록 되지 않도록 한다.
	public void registerCustomer(Customer customer){
		boolean isSame = false;
		
		if(customer == null){
			System.out.println("정보가 없습니다.");
			return;
	}else {
		for(Customer o: list){
			if(customer.getResidentNumber().equals(o.getResidentNumber())==true){
				isSame = true;
			}
		}
		if(isSame == true){
			System.out.println("주빈번호가 겹칩니다.");
			return;
		}
	}
	list.add(customer);
	
	return;
	
//아래는 중복을 제거하기 위한 메소드, 뭔지 꼼꼼히 들여다 보자. 어떤 메소드랑 중복이다. 근데 뭐랑 중복이지?
	Customer cc = searchCustomerByResidentNumber(customer.getResidentNumber());
	if(cc != null){
		System.out.println("같은 주민번호의 고객정보가 등록되어 있습니다.");
		return;
	}
		list.add(customer);
	}
	
	
	//list에 등록된 모든 고객의 정보를 출력하는 메소드 - toString() 이용
	public void printCustomerList(){
		for(Customer o : list){
			System.out.println(o.toString());
	}
		
		Iterator<Customer> itr = list.iterator();//이건 뭐지? 
		while(itr.hasNext()){
			System.out.println(itr.next());
		}

	}
	//매개변수로 주민번호를 받아 그 번호의 고객을 list에서 찾아 return하는 메소드
	//조회 결과 개수 : 당연히 한개, 똑같은 값 못들어가게 햇으니까. 못찾으면 0개, 그러니까 0=null리턴,1 둘중에 하나. 
	//리턴 타입은 커스터머 타입. 
	//매개변수 null이면 조회할 필요 없다. 그걸 체크해줘야 한다. 
	public Customer searchCustomerByResidentNumber(String residentNumber){
		if(residentNumber == null || residentNumber.length()==0){
			System.out.println("주민번호를 입력하시오.");
			return null;//왜 return null인가. 왜냐면 return 타입이 있기 때문에 어떤값이든 넘겨줘야 하는데 주민번호가 없으면 그 값은 null이니까 null을 넘겨준다.
		}
		for(Customer c : list){
			if(residentNumber.equals(c.getResidentNumber())){
				return c;
			}
		}
		System.out.println("자료가 없습니다.");
		return null;
	}
	//매개변수로 고객이름을 받아 그 이름의 고객을 list에서 찾아 return
	//매개변수가 null이면 조회할 필요 없다. 
	//조회결과 개수: 0~n개 (여러개)
	public ArrayList<Customer> searchCustomerByName(String name){
		ArrayList<Customer> returnList = new ArrayList<Customer>();
		if(name == null || name.length()==0){
			System.out.println("이름을 입력하시오");
			return null;
		}
		for(Customer c : list){
			if(name.equals(c.getName())){
				returnList.add(c);
			}
		}
		return returnList;
	}
	//매개변수로 받은 고객객체와 같은 주민번호를 가진 고객을 list에서 찾아 값 변경
	//전제 : 주민번호는 변경안됨.
	//1.매개변수 customer == null
	//2.매개변수로 받은 값과 같은 주민번호의 고객이 없는 경우
	//1.2번 경우에는 수정할 필요가 없다. 
	//*매개변수는 정확히 어떤 데이터가 올지는 모르지만 내가 특정 데이터만 받을 것이고 반드시 데이터를 받긴 받을것이란 걸 선언한거다. 잊지말자.
	public void updateCustomer(Customer customer){
		//고객을 찾는 메소드를 같은 클래스에서도 필요하다면 얼마든지 소환할 수 있다! 논리적인 흐름을 잘 이해하고 그걸 순서대로 명시하자.
		if(customer == null){
			System.out.println("수정할 고객 정보를 입력하세요");
		}
		Customer c = searchCustomerByResidentNumber(customer.getResidentNumber());
		if(c == null){
			System.out.println("정보가 없습니다.");
			return;
		}
		//찾았으면 수정해야지
		for(int idx = 0; idx <list.size();, idx++){//이건 그냥 외워라
			if(customer.getResidentNumber().equals(list.get(idx).getResidentNumber())){
				//만약에 프리미티브 타입간의 비교라면 그냥 == 써도 된다.
				list.set(idx, customer);
				break; //왜 브레이크인가? 리턴이랑 무슨 차이인가? 만약에 이 문에서 나와서 뭔가를 해야 할것이 있다면 리턴을 쓰면 안되고, 리턴쓰면 그냥 아에 되돌아가니까
				//근데 브레이크는 단순히 반복문과 스위치케이스문에서만 빠져나온거고 리턴은 메소드 자체를 종료시키는거다. 잊지마라.
			}
			
		}
		
		list.set(list.indexOf(c), customer);
		
		return;
	}
	//매개변수로 받은 주민번호의 고객정보를 list에 삭제 
	//1. 매개변수 주민번호가 없는 경우(null, 이거나 length()==0)
	//2.삭제할 주민번호의 고객이 없는 경우
	//1,2번째 경우면 삭제처리 할 필요가 없다. 
	public void removeCustomerByResidentNumber(String residentNumber){
		
		
		Customer c = searchCustomerByResidentNumber(residentNumber);
		
		if(c == null || residentNumber==null){
			System.out.println("그런 주민번호 없음");
			return;
		}
		if(searchCustomerByResidentNumber(residentNumber)==null){
			System.out.println("삭제할 고객의 없습니다.");
			return;
		}
		//여기까지 내려왔으면 삭제를 해야겠지/??
		for(int idx = 0; idx < list.size(); idx++){
			residentNumber.equals(list.get(idx).getResidentNumber()){
				list.remove(idx);//주민번호는 중복될 일이 없기 때문에 여기서 그냥 리턴하면 된다. 만약 중복이 가능한 이름이라면 어떻게 변할지 생각해보자. 
				return;
			}
		}
		//이건 천재의 방식. 어떤 차이가 있는지 위에 방식과 비교해보자. Customer c = searchCustomerByResidentNumber(residentNumber); 과 연결된거다. 분석하자. 
		list.remove(c);
		return;
	}
	//위에 메소드 메인메소드에서 실행시켜 보자. 
	//정리해서 흐름을 그리자. a가 실행되고 b가 실행되서 리턴된 값이 c로 넘어가고 이런 일련의 흐름을 읽자.
	
}
